#pragma once

#include <vector>
#include <iostream>
#include <bitset>
#include <string>
#include <vector>
#include <cmath>

using namespace std;

namespace byh
{
	template<size_t N>
	class bit_set
	{
	public:
		bit_set()
		{
			_v.resize(N / 32 + 1);
		}

		void set(int n)
		{
			int i = n / 32;
			int j = n % 32;

			_v[i] |= (1 << (31 - j));
		}

		void reset(int n)
		{
			int i = n / 32;
			int j = n % 32;

			_v[i] &= (~(1 << (31 - j)));
		}

		bool test(int n)
		{
			int i = n / 32;
			int j = n % 32;

			if ((_v[i] >> (31 - j)) & 1 == 1) return true;
			else return false;
		}

	protected:
		vector<int> _v;
	};

	template<size_t N>
	class twobitset
	{
	public:

		void set(int n)
		{
			bool bit1 = _bit1.test(n);
			bool bit2 = _bit2.test(n);

			if (!bit1 && !bit2) // 00->01
				_bit2.set(n);
			else if (!bit1 && bit2) // 01->10
			{
				_bit1.set(n);
				_bit2.reset(n);
			}
			else if (bit1 && !bit2) // 10->11
				_bit2.set(n);
		}

		int get_count(int n)
		{
			bool bit1 = _bit1.test(n);
			bool bit2 = _bit2.test(n);

			if (!bit1 && !bit2) return 0;
			else if (!bit1 && bit2) return 1;
			else if (bit1 && !bit2) return 2;
			else return 3;
		}

	protected:
		bit_set<N> _bit1;
		bit_set<N> _bit2;
	};
}
